/**
 * Created by sa on 2015/4/15.
 */

var _ = require('underscore');
var later = require('later');
var timeUtils = require('../utils/TimeUtils');
later.date.localTime();

/**
 * 每天01:01执行任务
 */
function everyDayTask() {
  //每天01:00
  //var cron = later.parse.text('at 01:00 am every 1 days');
  //var cron = later.parse.text('every 20 seconds');

  //每天01:00
  var basic = {h: [01], m: [00]};

  var composite = [
    basic
  ];

  var cron = {
    schedules: composite,
    exceptions: null//过滤不处理
  };
  //获取下100个执行时间
  //var occurrences = later.schedule(cron).next(100);
  //for(var i=0;i<100;i++){
  //  console.log(timeUtils.format(occurrences[i]));
  //}
  later.setInterval(function () {
    console.log("0000")
  }, cron);

}

/**
 * 执行任务，根据时间
 * @param date
 * @param cb
 * @returns {*}
 */
function excTaskByDate(date, cb) {

  var excDate = null;

  if (_.isString(date)) {//是字符串判断是不是时间格式的字符串
    /**
     * 判断时间是否正确
     */
    if (!timeUtils.isValidDateTime(date)) {
      return cb(false);
    }
    excDate = new Date(Date.parse(date.replace(/-/g, "/")));
  } else if (_.isDate(date)) {
    //判断是否为时间类型
    excDate = date;
  }

  console.log(excDate)

  //要执行任务的时间
  var basic = {
    Y: [excDate.getFullYear()],//年
    M: [excDate.getMonth() + 1],//月份
    D: [excDate.getDate()],
    h: [excDate.getHours()],
    m: [excDate.getMinutes()]
  };

  var composite = [
    basic
  ];
  var cron = {
    schedules: composite
  };
  console.log(cron);
  //获取下100个执行时间
  //var occurrences = later.schedule(cron).next(2);
  //for (var i = 0; i < 1; i++) {
  //  console.log(timeUtils.format(occurrences[i]));
  //}

  //设置到期执行任务
  var t = later.setTimeout(function () {
    //执行到时任务
    return cb(true , t);
  }, cron);
  return;
}

/**
 *  获取执行的时间列表
 * @param date
 * @param repeat 类型:0不重复，1天重复，2月重复，3年重复，4周重复
 * @param weeks  周数组字符串 1,2,3,4,5,6,7 1代表周一，7代表周六  前提是 repeat = 4
 * @returns {*}返回下400个时间对象
 */
function getNextExcTimeList(excDate, repeat, weeks) {

  //要执行任务的时间
  var basic = {
    //Y: [excDate.getFullYear()],//年
    //M: [excDate.getMonth() + 1],//月份
    //D: [excDate.getDate()],
    h: [excDate.getHours()],
    m: [excDate.getMinutes()]
  };

  //
  //var repeat = 2;
  //类型:0不重复，1天重复，2月重复，3年重复，4周重复
  switch (repeat) {
    case 0 ://不重复
      basic.Y = [excDate.getFullYear()];
      basic.M = [excDate.getMonth() + 1];
      basic.D = [excDate.getDate()];
      break;
    case 1 ://1天重复
      //basic.Y = [excDate.getFullYear()];
      //basic.M = [excDate.getMonth() + 1];
      break;
    case 2 ://2月重复
      basic.D = [excDate.getDate()];
      break;
    case 3 ://3年重复
      basic.M = [excDate.getMonth() + 1];
      basic.D = [excDate.getDate()];
      break;
    case 4 ://4周重复
      //basic.dw = [1];
      if (weeks != null) {
        var dwArray = new Array();
        //字符串转化成int数组
        _.each(_.sortBy(weeks.split(',')), function (item) {
          dwArray.push(Number(item));
        });
        basic.dw = dwArray;
      }

      break;
  }
  //console.log(basic)
  var composite = [
    basic
  ];
  var cron = {
    schedules: composite
  };

  later.date.localTime();
  var occurrences = later.schedule(cron).next(400);
  return occurrences;
}

/**
 * 获取今天要执行的任务时间
 * @param date
 * @param repeat 类型:0不重复，1天重复，2月重复，3年重复，4周重复
 * @param weeks  周数组字符串 1,2,3,4,5,6,7 1代表周一，7代表周六
 */
function getNextExcTimeInToday(date, repeat, weeks) {

  var nextExcTime = null;
  var excDate = null;
  if (_.isString(date)) {//是字符串判断是不是时间格式的字符串
    /**
     * 判断时间是否正确
     */
    if (!timeUtils.isValidDateTime(date)) {
      return nextExcTime;
    }
    excDate = new Date(Date.parse(date.replace(/-/g, "/")));
  } else if (_.isDate(date)) {
    //判断是否为时间类型
    excDate = date;
  }

  //获取下400个要执行的任务时间
  var excDateList = getNextExcTimeList(excDate, repeat, weeks);

  if (excDateList != null && _.isArray(excDateList)) {

    for (var i = 0; i < excDateList.length; i++) {
      var item = excDateList[i];
      //比较下时间是否是设置的时间之后
      if (item.getTime() >= excDate.getTime()) {
        //console.log(timeUtils.format(item));
        //如果是设置时间之后，判断下是不是今天要执行的任务
        if (timeUtils.inToday(item)) {
          //console.log(timeUtils.format(item) + "就这个");
          nextExcTime = item;
          break;
        }
      }
    }
  }
  return nextExcTime;
}


/**
 * 获取下一个要执行的时间，时间大于传入时间
 * @param date
 * @param repeat 类型:0不重复，1天重复，2月重复，3年重复，4周重复
 * @param weeks  周数组字符串 1,2,3,4,5,6,7 1代表周一，7代表周六
 */
function getNextExcTime(date, repeat, weeks) {

  var nextExcTime = null;
  var excDate = null;
  if (_.isString(date)) {//是字符串判断是不是时间格式的字符串
    /**
     * 判断时间是否正确
     */
    if (!timeUtils.isValidDateTime(date)) {
      return nextExcTime;
    }
    excDate = new Date(Date.parse(date.replace(/-/g, "/")));
  } else if (_.isDate(date)) {
    //判断是否为时间类型
    excDate = date;
  }

  //获取下400个要执行的任务
  var excDateList = getNextExcTimeList(excDate, repeat, weeks);

  if (excDateList != null && _.isArray(excDateList)) {

    for (var i = 0; i < excDateList.length; i++) {
      var item = excDateList[i];
      //比较下时间是否是设置的时间之后
      if (item.getTime() >= excDate.getTime()) {
        //console.log(timeUtils.format(item));
        nextExcTime = item;
        break;
      }
    }
  }
  return nextExcTime;
}

function aa() {

  later.date.localTime();
  var sched = later.parse.recur().every(1).second();
  var t = later.setTimeout(function () {
    test(5);
  }, sched);

  function test(val) {
    console.log(new Date());
  }
}


module.exports.excTaskByDate = excTaskByDate;
module.exports.everyDayTask = everyDayTask;
module.exports.getNextExcTimeList = getNextExcTimeList;
module.exports.getNextExcTimeInToday = getNextExcTimeInToday;
module.exports.getNextExcTime = getNextExcTime;

//excTaskByDate('2015-04-16 17:52:00', function (flag) {
//
//  console.log(flag);
//
//  if (flag) {
//    console.log("定期执行了");
//  }
//
//});

//
//console.log(timeUtils.format(getNextExcTime('2015-01-04 08:08:08' , 4 , '1')))
//console.log(getNextExcTimeList(new Date() , 4 , '1,2'))
////aa();

//console.log(_.sortBy([7,4,2,1]))





